#pragma once

#include <vector>
#include <glm\glm.hpp>

#include "Algoritmo2D.h"
#include "MallaControl.h"
#include "BernsteinPol.h"


class Bezier2D : public Algoritmo2D {
public:
	Bezier2D(unsigned int ptsLargo, unsigned int ptsAncho);
	~Bezier2D();

	virtual void addCurvaControl( std::vector< glm::vec3 > vecVectices );

	virtual glm::vec3 eval(float u, float v) const;

	// Permite conocer los limites de evaluacion de la superficie
	virtual float getLimiteSuperior() const;
	virtual float getLimiteInferior() const;

private:
	unsigned int m_cantCurvas;
	const unsigned int m_cantMaximaCurvas;
	const unsigned int m_cantMinimaPtsPorCurva;

	// Los polinomios para los calculos
	BernsteinPol m_Bu;
	BernsteinPol m_Bv;

	MallaControl m_grillaPuntos;

	// Que el valor pertenesca al rango [0; 1]
	bool fueraDeRango(float a) const;
};

